package com.atguigu.srb.common.utils;

import com.atguigu.srb.common.exception.BusinessException;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * 随机数生成工具类
 * 提供生成固定位数随机数字、从集合中随机抽取元素等功能
 */
public class RandomUtils {

    private static final Random RANDOM = new Random();
    private static final DecimalFormat FOUR_DIGIT_FORMAT = new DecimalFormat("0000");
    private static final DecimalFormat SIX_DIGIT_FORMAT = new DecimalFormat("000000");

    /**
     * 生成4位随机数字字符串
     * 范围从0000到9999
     *
     * @return 4位数字字符串
     */
    public static String getFourBitRandom() {
        return FOUR_DIGIT_FORMAT.format(RANDOM.nextInt(10000));
    }

    /**
     * 生成6位随机数字字符串
     * 范围从000000到999999
     *
     * @return 6位数字字符串
     */
    public static String getSixBitRandom() {
        return SIX_DIGIT_FORMAT.format(RANDOM.nextInt(1000000));
    }

    /**
     * 从给定集合中随机抽取指定数量的元素
     *
     * @param sourceList 源集合
     * @param count      需要抽取的元素数量
     * @param <T>        集合元素类型
     * @return 随机抽取的元素列表
     * @throws BusinessException 如果源集合为空或抽取数量超过源集合大小
     */
    public static <T> List<T> getRandom(List<T> sourceList, int count) {
        if (sourceList == null || sourceList.isEmpty()) {
            return Collections.emptyList();
        }

        if (count <= 0 || count > sourceList.size()) {
            throw new BusinessException("抽取数量必须大于0且不超过源集合大小");
        }

        // 复制源列表防止修改原始数据
        List<T> copyList = new ArrayList<>(sourceList);
        Collections.shuffle(copyList, RANDOM);
        return copyList.subList(0, count);
    }
}